package com.myProxy.jdk;

import org.junit.Test;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Auther: Liang
 * @Date: 2024/5/14 - 05 - 14 - 11:18
 * @Description: com.myProxy.jdk
 * @version: 1.0
 */
public class JDKProxy {
    @Test
    public void jdk(){
        //创建目标类
        Target target = new Target();
        //使用jdk动态代理创建目标类
        //1.加载目标类的类加载器
        ClassLoader classLoader = target.getClass().getClassLoader();
        //2.获取目标类的实现接口
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //3.创建增强方法
        InvocationHandler invocationHandler = new InvocationHandler() {

          //重写的方法就相当于代理的方法
          //proxy就是当前代理对象
          //method被代理的方法
          //args方法执行原本的参数
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("结婚前准备");
                Object invoke = method.invoke(target, args);

                System.out.println("结婚后准备");

                return invoke;
            }
        };
        //使用jdk动态代理 创建代理对象传入对应参数
        //因为我们知道新生成的代理对象与目标对象实现了相同的接口 所以可以转换为接口类型
       Marryinterface proxy = (Marryinterface) Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
     //调用代理类增强后的方法
        proxy.marry();

        proxy.add(1,2);

    }
}
